package com.cas.utils;

import org.apache.commons.beanutils.BeanUtilsBean;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;

/**
 * BeanUtils
 * 
 * @author yuzhou
 * @date 2017年6月13日
 * @time 下午5:21:22
 *
 */
public class BeanUtils extends org.apache.commons.beanutils.BeanUtils {

    private static Converter converter = (Object o, Class aClass, Object o1) -> o == null ? null : BeanUtilsBean.getInstance().getConvertUtils().convert(o, aClass);

    /**
     * 属性拷贝
     * @param target
     * @param source
     */
    public static void copy(Object target, Object source) {
        BeanCopier copier = BeanCopier.create(source.getClass(), target.getClass(), false);
        copier.copy(source, target, null);
    }

    /**
     * 属性拷贝,支持数据类型转换
     * 建议使用性能更高的 {@link #copy(Object, Object)} 方法
     * @param dest 目的对象 
     * @param orig 源对象
     */
    public static void copyProperties(Object dest, Object orig) {
        BeanCopier copier = BeanCopier.create(orig.getClass(), dest.getClass(), true);
        copier.copy(orig, dest, converter);
    }

    /**
     * 拷贝并返回目标对象，支持数据类型转换
     * @param dest
     * @param orig
     * @return
     */
    public static <D, O> D copyPropertiesReturnDest(D dest, O orig) {
        copyProperties(dest, orig);
        return dest;
    }
}
